package me.wangshier.restapi.taco.web.api;

import me.wangshier.restapi.taco.data.TacoRepository;
import me.wangshier.restapi.taco.domian.Taco;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.Optional;

/**
 * @Author: tongqianwen
 * @Date: 2024/12/15
 */
@RestController
@RequestMapping(path = "/api/tacos", produces = {"application/json", "text/xml"})
// produces 限定所有处理器方法只会处理 Accept 头信息包含「application/json」的请求，表明客户端只能处理 JSON 格式的响应。
@CrossOrigin(origins = "http://tacocloud:8080") // 允许跨域请求
public class TacoController {
    @Autowired
    private TacoRepository tacoRepo;

    @GetMapping(params = "recent") // 「/api/tacos?recent」的 GET 请求。
    public Iterable<Taco> recentTacos() {
        PageRequest page = PageRequest.of(0, 12, Sort.by("createdAt").descending());
        return tacoRepo.findAll(page).getContent();
    }

    @GetMapping("/{id}")
    public ResponseEntity<Taco> tacoById(@PathVariable("id") Long id) {
        Optional<Taco> optTaco = tacoRepo.findById(id);
        if (optTaco.isPresent()) {
            return new ResponseEntity<>(optTaco.get(), HttpStatus.OK);
        }
        return new ResponseEntity<>(null, HttpStatus.NOT_FOUND);
    }

    @PostMapping(consumes = "application/json")// 使用 consumes 属性就表明该方法只会处理 Content-type 与「application/json」相匹配的请求。
    @ResponseStatus(HttpStatus.CREATED)// 在我们的 POST 请求中，201 （CREATED）的 HTTP 状态更具有描述性。它会告诉客户端，请求不仅成功了，而且还创建了一个资源。
    public Taco postTaco(@RequestBody Taco taco) {//方法的 Taco 参数带有@RequestBody 注解，这表明请求体应该被转换为一个 Taco 对象并绑定到该参数上。
        return tacoRepo.save(taco);
    }
}
